package cn.rumoss.nettytest.time;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class TimeServerHandler extends ChannelHandlerAdapter{
  
  /**
   * 连接被建立并且准备进行通信时被调用
   */
  @Override
  public void channelActive(final ChannelHandlerContext ctx) throws Exception{
    
    /**
     * 在不接受任何请求时他会发送一个含32位的整数的消息,
     * 并且一旦消息发送就会立即关闭连接
     */
    final ByteBuf time = ctx.alloc().buffer(4);//
    int currentTime = (int) (System.currentTimeMillis() / 1000L + 2208988800L);
    System.out.println("服务端准备写: " +currentTime);
    time.writeInt(currentTime);
    /*ByteBuf之所以没有这个方法因为有两个指针，一个对应读操作一个对应写操作。
     * 当你向ByteBuf里写入数据的时候写指针的索引就会增加，同时读指针的索引没有变化。
     * 读指针索引和写指针索引分别代表了消息的开始和结束。
     * 比较起来，NIO缓冲并没有提供一种简洁的方式来计算出消息内容的开始和结尾，除非你调用flip方法。
     * 当你忘记调用flip方法而引起没有数据或者错误数据被发送时，你会陷入困境。
     * 这样的一个错误不会发生在Netty上，因为我们对于不同的操作类型有不同的指针。*/
    
    final ChannelFuture f = ctx.writeAndFlush(time);// 代表了一个还没有发生的I/O操作
    f.addListener(new ChannelFutureListener(){
      public void operationComplete(ChannelFuture future){
        assert f == future;
        ctx.close();
      }
    });
    
  }
  
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) throws Exception{
    
    // 当异常发生的时候关闭连接
    cause.printStackTrace();
    ctx.close();
    
  }
  
}
